/**
 * Create in 2012-4-11.
 */
package kit4j.generator.keyed;

import java.util.Random;

/**
 * 随机枚举元素生成器。
 * 
 * @author MiniKnife
 * @param <T>
 *            要生成的枚举元素的类型
 * 
 */
public class RandomEnumKeyedGenerator<T extends Enum<T>> implements IKeyedGenerator<Class<T>, T> {

	private Random rand;

	/**
	 * 创建一个随机枚举元素生成器。
	 */
	public RandomEnumKeyedGenerator() {
		rand = new Random(System.currentTimeMillis());
	}

	/**
	 * 随机返回指定枚举类型的元素中的一个元素对象。
	 * 
	 * @param enumClass
	 *            枚举类型的Class对象
	 * @return 指定枚举类型的一个元素对象。
	 * @see kit4j.generator.keyed.IKeyedGenerator#next(java.lang.Object)
	 */
	@Override
	public T next(Class<T> enumClass) {
		if (enumClass.isEnum()) {
			T[] enumValues = enumClass.getEnumConstants();
			int randomIndex = rand.nextInt(enumValues.length);

			return enumValues[randomIndex];
		} else {
			return null;
		}
	}

	/**
	 * 单例随机数生成器对象的持有者。
	 * 
	 * @author MiniKnife
	 *
	 */
	private static class SingletonHolder {
		private static Random singletonRandom = new Random(System.currentTimeMillis());

		static Random getSingletonRandom() {
			return singletonRandom;
		}
	}

	/**
	 * 随机返回指定枚举类型的元素中的一个元素对象。
	 * 
	 * @param enumClass
	 *            枚举类型的Class对象
	 * @return 指定枚举类型的一个元素对象。
	 */
	public static <E extends Enum<E>> E nextEnum(Class<E> enumClass) {
		E[] enumValues = enumClass.getEnumConstants();
		int randomIndex = SingletonHolder.getSingletonRandom().nextInt(enumValues.length);

		return enumValues[randomIndex];
	}

}
